#-*- coding:utf-8 -*-
import pygame
from pygame.locals import *		#pygame使用的各种常量
import random

#放置玩家英雄飞机，并绑定键盘事件，实现飞机移动
class HeroPlane:
	'''玩家飞机类（英雄）'''
	def __init__(self,screen_temp):
		self.x = 200
		self.y = 400
		self.screen = screen_temp

		#self.image的type是pygame.Surface
		self.image = pygame.image.load("./images/me.png")
		self.bullet_list = pygame.sprite.Group() #存储发射出去的子弹对象引用

	def display(self):
		'''绘制玩家到窗口中'''

		#遍历移动子弹，绘制及判断越界
		for bullet in self.bullet_list:
			bullet.display()
			bullet.move()

		self.screen.blit(self.image,(self.x,self.y))

	def move_left(self):
		'''左移动，并判断防止越界'''
		self.x -= 5
		if self.x < 0:
			self.x = 0

	def move_right(self):
		'''右移动，并判断防止越界'''
		self.x += 5
		if self.x > 406:
			self.x = 406

	def move_up(self):
		'''上移动，并判断防止越界'''
		self.y -=5
		if self.y < 0:
			self.y = 0

	def move_down(self):
		'''下移动，并判断防止越界'''
		self.y +=5
		if self.y > 492:
			self.y = 492

	def fire(self):
		self.bullet_list.add(Bullet(self.screen,self.x,self.y))

class Bullet(pygame.sprite.Sprite):
	'''玩家子弹类'''
	def __init__(self,screen_temp,x,y):
		pygame.sprite.Sprite.__init__(self) 
		self.screen = screen_temp
		self.image = pygame.image.load("./images/pd.png")
		self.rect = self.image.get_rect()
		self.rect.topleft = (x+51,y)

	def display(self):
		self.screen.blit(self.image,self.rect)

	def move(self):
		self.rect.top -= 5
		if self.rect.bottom < -20:
			self.kill()

class EnemyPlane(pygame.sprite.Sprite):
	'''敌机的类'''
	def __init__(self,screen_temp):
		pygame.sprite.Sprite.__init__(self) 
		self.screen = screen_temp
		self.image = pygame.image.load("./images/e"+str(random.choice(range(3)))+".png")
		self.rect = self.image.get_rect()
		self.rect.topleft = (random.choice(range(408)),-75)
		self.explode_index = 0

	def display(self):
		self.screen.blit(self.image,(self.x,self.y))

	def update(self):
		self.rect.top += 4

		#判断敌机是否越界
		if self.rect.top > 568:     
			self.kill()		

def key_control(hero_temp):
	'''键盘控制函数'''

	#获取事件，比如按键等
	events = pygame.event.get()
	for event in events:
		#判断是否是点击了退出按钮
		if event.type == QUIT:
			print("exit")
			exit()

	#获取按下的键（返回的是元组值）
	pressed_keys = pygame.key.get_pressed()

	#检测是否按下a或者left键
	if pressed_keys[K_LEFT] or pressed_keys[K_a]:
		hero_temp.move_left()

	#检测是否按下d或者right键
	if pressed_keys[K_RIGHT] or pressed_keys[K_d]:
		hero_temp.move_right()

	#检测是否按下w或者up键
	if pressed_keys[K_UP] or pressed_keys[K_w]:
		hero_temp.move_up()

	#检测是否按下s或者down键
	if pressed_keys[K_DOWN] or pressed_keys[K_s]:
		hero_temp.move_down()

	#检测是否按下a或者left键
	if pressed_keys[K_SPACE]:
		for event in events:
			if event.type == KEYDOWN:
				hero_temp.fire()

def main():
	'''游戏的主程序执行函数'''

	#1.创建窗口：set_mode(分辨率=(0,0),标志=0,深度=0)
	#需要注意的是下面的screen的type是pygame.Surface,所以后面才能直接使用self.screen.blit()
	screen = pygame.display.set_mode((512,568),0,0)
	pygame.display.set_caption('飞机大战') 

	#2.创建一个游戏背景图片（512*1536）
	background = pygame.image.load("./images/bg2.png")
	m = -968 #初始化游戏背景图片标轴y的值

	#3.创建一个玩家飞机对象
	hero = HeroPlane(screen)

	#4.定义用于存放敌机组
	enemylist = pygame.sprite.Group()

	#5.定义用于存放击毁敌机组
	enemylist_down = pygame.sprite.Group()

	#创建时钟对象
	clock = pygame.time.Clock()

	#载入并裁剪，用于后续遍历图片列表输出爆炸画面
	explode = pygame.image.load("./images/bomb.png")
	explode_surface = []
	explode_surface.append(explode.subsurface(pygame.Rect(0, 0, 32, 32)))
	explode_surface.append(explode.subsurface(pygame.Rect(32, 0, 32, 32)))
	explode_surface.append(explode.subsurface(pygame.Rect(64, 0, 32, 32)))
	explode_surface.append(explode.subsurface(pygame.Rect(96, 0, 32, 32)))

	#爆炸画面播放间隔参数
	ticks = 0
	while True:
		#控制游戏最大帧数
		clock.tick(60)

		#绘制动态背景
		screen.blit(background,(0,m))
		m+=2
		if m >= -200:
			m = -968

		#显示玩家
		hero.display()

		#调用键盘控制函数
		key_control(hero)

		#随机输出敌机
		if random.choice(range(50)) == 10:
			enemylist.add(EnemyPlane(screen))

		#显示敌机，移动敌机
		enemylist.update()
		enemylist.draw(screen)

		#检测敌机与子弹的碰撞，并绘制爆炸画面
		enemylist_down.add(pygame.sprite.groupcollide(enemylist, hero.bullet_list, True, True))
		for enemy_down in enemylist_down:
			screen.blit(explode_surface[enemy_down.explode_index],(enemy_down.rect.centerx-10,enemy_down.rect.centery-10))
			if ticks % 15 == 0:
				if enemy_down.explode_index < 3:
					enemy_down.explode_index += 1
				else:
					enemylist_down.remove(enemy_down)

		#爆炸画面播放间隔参数
		ticks += 1

		#更新屏幕显示
		pygame.display.update()

#判断当前是否是主程序，若是就执行主程序
if __name__ == "__main__":
	main()





